/**
 * 解析流式响应
 * 
 * @param {ReadableStream} stream - 可读流
 * @param {Function} onData - 收到数据时的回调函数
 * @param {AbortSignal} signal - 用于取消请求的信号
 * @returns {Promise<void>}
 */
export async function parseStream(stream, onData, signal) {
  const reader = stream.getReader();
  const decoder = new TextDecoder();
  let buffer = "";

  try {
    while (true) {
      // 检查是否取消
      if (signal && signal.aborted) {
        reader.cancel();
        break;
      }

      const { done, value } = await reader.read();

      if (done) {
        break;
      }

      // 解码二进制数据
      buffer += decoder.decode(value, { stream: true });

      // 处理缓冲区中的数据
      const lines = buffer.split("\n\n");
      buffer = lines.pop() || ""; // 保留最后一个不完整的行

      // 遍历每一行数据
      for (const line of lines) {
        if (line.startsWith("data: ") && line !== "data: [DONE]") {
          try {
            const jsonStr = line.substring(6); // 去掉 'data: ' 前缀
            const json = JSON.parse(jsonStr);

            // 判断JSON数据是否符合预期格式
            if (
              json.choices &&
              json.choices.length > 0 &&
              json.choices[0].delta &&
              json.choices[0].delta.content
            ) {
              // 调用回调函数处理数据
              onData(json.choices[0].delta.content);
            }
          } catch (e) {
            console.error("解析JSON失败:", e);
          }
        }
      }
    }
  } finally {
    // 释放读取器锁
    reader.releaseLock();
  }
}

/**
 * 发送流式请求
 * 
 * @param {Object} options - 请求选项
 * @param {string} options.url - 请求URL
 * @param {Object} options.data - 请求数据
 * @param {string} options.apiKey - API密钥
 * @param {Function} options.onData - 收到数据时的回调函数
 * @param {AbortSignal} options.signal - 用于取消请求的信号
 * @returns {Promise<void>}
 */
export async function sendStreamRequest(options) {
  const { url, data, apiKey, onData, signal } = options;

  const response = await fetch(url, {
    method: "POST",
    headers: {
      Authorization: "Bearer " + apiKey,
      "Content-Type": "application/json",
    },
    body: JSON.stringify(data),
    signal: signal,
  });

  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }

  await parseStream(response.body, onData, signal);
} 